﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using PlanoAula.BD;
using PlanoAula.Repository;

namespace PlanoAula
{
    public partial class ListDiaNaoUtilForm : FormEdicao
    {
        IDiaNaoUtilRepository repository;
        public ListDiaNaoUtilForm() : this(new DiaNaoUtilRepository()) { }
        
        public ListDiaNaoUtilForm(IDiaNaoUtilRepository DiaNaoUtilRepository)
            : base()
        {
            this.repository = DiaNaoUtilRepository;
            InitializeComponent();
        }
        private void CarregarInformacoes()
        {
            if (diaNaoUtilBindingSource.Current != null)
            {
                IdItem = ((DiaNaoUtil)diaNaoUtilBindingSource.Current).Id;
                var dia = repository.GetByKey(IdItem);
                edtData.Value = dia.Data;
                edtDescricao.Text = dia.Descricao;
            }
        }
        private void editarToolStripMenuItem_Click(object sender, EventArgs e)
        {
            CarregarInformacoes();
            HabilitarEdicao(true);
        }
        private void SalvarDiaNaoUtil()
        {
            var dia = repository.GetByKey(IdItem);
            if (dia == null)
            {
                dia = new DiaNaoUtil { Id = Guid.NewGuid(), Data = edtData.Value, Nome = String.Format("Feriado dia {0}", edtData.Value.ToShortDateString()), Descricao = edtDescricao.Text };
            }
            else
            {
                dia.Data = edtData.Value;
                dia.Descricao = edtDescricao.Text;
            }
            repository.Save(dia);
            HabilitarEdicao(false);
            AtualizarGrid();
        }
        private void MontarCmbAno()
        {
            List<DateTime> lista = new List<DateTime>();

            var data = repository.GetAll().GroupBy(ra => new { ra.Data.Year, Month = 01, Day = 01 }).
            OrderByDescending(ra => new { ra.Key.Year }).
            Select(ra => new { Key = ra.Key }).
            ToList();

            var datasSelecionadas = data.Select(ra => new DateTime(ra.Key.Year, ra.Key.Month, ra.Key.Day));
            cmbAno.DataSource = datasSelecionadas.ToList();
        }

        private void MontarCmbMes()
        {
            if (cmbAno.SelectedItem != null)
            {
                var itemSelecionado = cmbAno.SelectedItem.ConvertTo<DateTime>();
                var data = repository.GetAll()
                    .Where(w => w.Data.Year == itemSelecionado.Year)
                    .GroupBy(ra => new { ra.Data.Year, ra.Data.Month, Day = 01 })
                    .OrderByDescending(ra => new { ra.Key.Year, ra.Key.Month })
                    .Select(ra => new { Data = ra.Key })
                    .ToList();
                /*
                                    var mes = (from d in db.DiaNaoUtil
                                               where (cmbAno.SelectedItem == null || d.Data.Year == itemSelecionado.Year)
                                               select new { Data = new DateTime(DateTime.Now.Year, d.Data.Month, 01) }).Distinct();

                 */
                cmbMes.DataSource = data.Select(ra => new DateTime(ra.Data.Year, ra.Data.Month, ra.Data.Day)).ToList();
            }
        }
        private void AtualizarFiltros()
        {
            MontarCmbAno();
            MontarCmbMes();
            
        }
        private void AtualizarGrid()
        {
            AtualizarGrid(false);
        }
        private void AtualizarGrid(bool atualizarFiltro )
        {
            if( atualizarFiltro )
                AtualizarFiltros();
            using (dbDataContext db = new dbDataContext())
            {
                if (cmbMes.SelectedItem != null)
                {
                    var ano = cmbAno.SelectedItem.ConvertTo<DateTime>().Year;
                    var mes = cmbMes.SelectedItem.ConvertTo<DateTime>().Month;
                    diaNaoUtilBindingSource.DataSource = repository.GetItemsMesAno(ano, mes);
                }
            }
        }

        private void btnSalvar_Click(object sender, EventArgs e)
        {
            SalvarDiaNaoUtil();
            
        }
        private void HabilitarEdicao(bool Habilitar)
        {
            gbxEdicao.Enabled = Habilitar;
        }
        private void toolStripButtonAdicionar_Click(object sender, EventArgs e)
        {
            this.IdItem = base.GetDefaultItem();
            edtData.Value = cmbMes.SelectedItem == null ? DateTime.Today : cmbMes.SelectedItem.ConvertTo<DataRowView>()[0].ConvertTo<DateTime>().AddDays(DateTime.Today.Day-1);
            edtDescricao.Text = "";
            HabilitarEdicao(true);
        }

        private void apagarToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (diaNaoUtilBindingSource.Current != null && MessageBox.Show("Confirma a exclusão do item?", "Excluir", MessageBoxButtons.OKCancel) == DialogResult.OK)
            {
                IdItem = ((DiaNaoUtil)diaNaoUtilBindingSource.Current).Id;
                repository.Delete(IdItem);
                AtualizarGrid();
            }
        }

        private void ListDiaNaoUtilForm_Load(object sender, EventArgs e)
        {
            HabilitarEdicao(false);
            AtualizarGrid(true);
        }

        private void cmbAno_Format(object sender, ListControlConvertEventArgs e)
        {
            e.Value = e.ListItem.ConvertTo<DateTime>().Year.ToString();
        }

        private void cmbMes_Format(object sender, ListControlConvertEventArgs e)
        {
            e.Value = e.ListItem.ConvertTo<DateTime>().ToString("MMMM").ToUpper();

        }

        private void cmbAno_SelectedValueChanged(object sender, EventArgs e)
        {
            MontarCmbMes();
            AtualizarGrid(false);
        }

        private void cmbMes_SelectedValueChanged(object sender, EventArgs e)
        {
            AtualizarGrid(false);

        }

        private void btnAtualizarFiltro_Click(object sender, EventArgs e)
        {
            AtualizarFiltros();
        }

        private void dgvDados_SelectionChanged(object sender, EventArgs e)
        {
            CarregarInformacoes();
            HabilitarEdicao(false);   
        }

        private void dgvDados_DoubleClick(object sender, EventArgs e)
        {
            editarToolStripMenuItem_Click(sender, e);
        }

        private void importarDoGoogleCalendarToolStripMenuItem_Click(object sender, EventArgs e)
        {
            new ImportarFeriadosDoGoogleForm().ShowDialog();
            AtualizarGrid(true);
        }

        private void toolStripButtonVisualizar_Click(object sender, EventArgs e)
        {
            int AnoSelecionado = cmbAno.SelectedItem == null ? 0 : ((DataRowView)cmbAno.SelectedItem)[0].ConvertTo<DateTime?>().Value.Year;
            #warning Reativar quando os relatórios estiverem OK.
            //new Reports.relDiaNaoUteisForm(AnoSelecionado).ExbirFormulario(this);

        }
        private bool PossuiAnoSelecionado { get { return cmbAno.SelectedItem != null; } }
        private int AnoSelecionado { get { return cmbAno.SelectedItem.ConvertTo<DateTime>().Year; } }
        private int MesSelecionado { get { return cmbMes.SelectedItem.ConvertTo<DateTime>().Month; } }
        private bool PossuiMesSelecionado { get { return cmbMes.SelectedItem != null; } }

        private void apagarTodosDoMesToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (PossuiAnoSelecionado && PossuiMesSelecionado)
            {
                repository.ApagarTodosDoMes(AnoSelecionado, MesSelecionado);                    
                AtualizarGrid(true);
            }
            else
            {
                MessageBox.Show("Informe um mês/ano a ser excluído.");
            }
        }

        private void apagarTodosDoAnoToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (PossuiAnoSelecionado)
            {
                repository.ApagarTodosDoAno(AnoSelecionado);
                AtualizarGrid(true);
            }
            else
            {
                MessageBox.Show("Informe um ano a ser excluído.");
            }
        }

        private void copiarFeriadosParaOProximoAnoToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (PossuiAnoSelecionado)
            {
                repository.CopiarFeriadosParaOAno(AnoSelecionado, AnoSelecionado+1);
                AtualizarGrid(true);
            }
            else
            {
                MessageBox.Show("Informe um ano a ser excluído.");
            }
        }

       
    }
}
